/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package org.ejb.controlador.servicioWeb;

import java.io.Serializable;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.ejb.controlador.Credenciales;
import org.ejb.controlador.Login;
import org.ejb.negocio.BinjuegoFacade;
import org.ejb.negocio.JuegosFacade;
import org.ejb.negocio.UsuariosFacade;
import org.ejb.negocio.XmljuegoFacade;
import org.ejb.persistencia.Binjuego;
import org.ejb.persistencia.Juegos;
import org.ejb.persistencia.Usuarios;
import org.ejb.persistencia.Xmljuego;

/**
 *
 * @author MoisesAntonio
 */
@ApplicationScoped
@Named("servicioWebController")
public class ServicioWebController implements Serializable{
    
    //Tanto como Credencial, como Login son necesarios para llevar a cabo el acceso al web service.
    @Inject
    Credenciales c;
    
    
    @Inject
    Login login;
    
    //Inyectamos de la capa de negocio JuegosFacade para poder trabajar con la bbdd;
    @EJB
    JuegosFacade ejbJuegos;
    @EJB
    UsuariosFacade ejbUsuarios;
    @EJB
    BinjuegoFacade ejbBin;
    @EJB
    XmljuegoFacade ejbXml;
    
    
    public ServicioWebController() {}

    public Credenciales getCredencial(){
        return c;
    }
    
    
    public Login getLogin() {
        return login;
    }

    public void setLogin(Login login) {
        this.login = login;
    }

    
    /**
     * Este método crea el juego enviado por parametro
     * @param u Usuario que crea el juego
     * @param j Juego a crear.
     * @return Id del juego, -1 si hay un error en la bbdd.
     */
    public Juegos crearJuego(Usuarios u, Juegos j){
        if(j!=null && j.getPropiedad().equals(u)){
            
            try {
                ejbJuegos.create(j);                
                return j;
            }
            catch(Exception e){
                return null;
            }
        }
        return null;
    }
    
    /**
     * Este método carga el juego que el usuario quiera modificar o simplemente
     * cargar en el editor.
     * @return id del juego
     *
    public int cargarJuego(){
        if(current!=null){
            try{
                return ejbFacade.find(current).getIdJuego();
            }
            catch(Exception e){
                return -1;
            }
        }
        return -1;
    }   Metodo sin sentido, la lista te da los juegos.
    */
    
    /**
     * Devuelve en crudo la lista XmlJuego
     * @param j Juego del que se cargará el XML
     * @return Lista de los Xml del juego
     */
    public Xmljuego cargarXmlJuego(Juegos j){
        if(j!=null){
           return ejbXml.find(j.getIdJuego());
        }
        return null;
    }
    
    /**
     * Devuelve todos los objetos binarios que corresponden al juego, puede ser que esto tarde.
     * @param j Juego del que se cargará los binarios
     * @return Lista de todos los binarios (imágenes y sonidos del juego).
     */
    public List<Binjuego> cargarBinJuego(Juegos j){
        if(j!=null){
            return ejbJuegos.find(j.getIdJuego()).getBinjuegoList();
        }
        return null;
    }
    
    /**
     * Este método guarda los Xml's de un juego.
     * @param j Juego al que se le añadirá el xml
     * @param subido Xml's del juego correspondiente
     * @return id del juego, -1 si hay un error de persistencia.
     */
    public void subirXmlJuego(Xmljuego subido){
        ejbXml.create(subido);
    }
    
    /**
     * Metodo para subir los binarios del juego
     * @param bin Bin a subir, debe llevar ya sus claves bien puestas.
     */
    public void subirBinJuego(Binjuego bin){
        ejbBin.create(bin);
    }
    
    /**
     * Devuelve la lista de juegos que tiene el usuario que se ha autenticado 
     * en el servicio.
     * @param u Usuario sobre el que se realizará la búsqueda.
     * @return Lista de juegos del usuario.
     */
    public List<Juegos> listarJuegos(Usuarios u){
        if(u!=null){
            return ejbUsuarios.find(u.getNombreUsuario()).getJuegosList();
        }
        return null;
    }
    
    /**
     * Para publicar un juego, primero se debe haber cargado el juego a publicar.
     * @param publicar Indicador de publicar (true) o retirar (false).
     * @param j Juego a publicar.
     * @return Devuelve exactamente lo mismo que le entró.
     */
    public boolean publicarJuego(boolean publicar, Juegos j){
        if(j!=null){
            j.setPublicado(publicar);
            try{
                ejbJuegos.edit(j);
                return publicar;
            }
            catch(Exception e){
                return !publicar;
            }
        }
        return !publicar;
    }
    
    
}
